package notes.java.nio.demo;


import java.nio.ByteBuffer;

import org.junit.Test;

/**
 * 缓冲区（buffer）用于数据存储，缓冲区就是数组，数据不同就有不同的缓冲区(除了boolean外，其它基本都有) 
 * ShortBuffer
 * CharBuffer 
 * IntBuffer
 * LongBuffer
 * DoubleBuffer 
 * ByteBuffer 
 * 以上基本是通过allocate() 来获取缓冲区。
 * 
 * 缓冲区核心存取数据的方法： 
 * put() 存
 * get() 取
 * 
 * 核心属性有： 
 * position 位置 
 * limit 界限，可以操作的数据大小，limit之外的数据不能读写操作 
 * capacity 缓冲区的容量，最大存储容量
 * mark 标记，记录position的位置
 * 
 */
public class N1_TestBuffer {

	@Test
	public void testBuffer() {
		// 1、分配一个指定大小的缓冲区
		ByteBuffer buffer = ByteBuffer.allocate(1024);
		print(buffer);
		
		// 2、存入数据
		byte[] bytes = "abcdef".getBytes();
		buffer.put(bytes);
		print(buffer);
		
		// 3、切换成读取模式
		buffer.flip();
		print(buffer);
		
		// 4、读取数据
		byte[] bytes2 = new byte[buffer.limit()];
		buffer.get(bytes2);
		System.out.println(new String(bytes2));
		print(buffer);
		
		// 5、rewind可重复读取
		buffer.rewind();
		print(buffer);
		
		// 6、清空缓冲区(但数据还存在，limit/position发生了变化，数据被遗忘状态)
		buffer.clear();
		print(buffer);
		
		System.out.println((char)buffer.get(0)); // 但仍然可以获取只是不知道有多少了，如果有记录仍可以把数据都拿到
		
	}
	
	/** mark 标记，记录position的位置*/
	@Test
	public void testMark() {
		// 分配大小
		ByteBuffer buffer = ByteBuffer.allocate(10);
		// 存
		buffer.put("abcdefg".getBytes());
		// 切换读模式
		buffer.flip();
		byte[] b = new byte[10];
		buffer.get(b, 0, 2);
		System.out.println(new String(b));
		System.out.println("当前位置：" + buffer.position());
		// 标记当前位置
		buffer.mark();
		// 继续读
		buffer.get(b, 2, 2);
		System.out.println(new String(b));
		System.out.println("当前位置：" + buffer.position());
		// 恢复
		buffer.reset();
		System.out.println("当前位置：" + buffer.position());
		
		// 判断缓冲区是否还有剩余的数据
		if(buffer.hasRemaining()) {
			System.out.println("剩余多少：" + buffer.remaining()); // 还有多少数据
		}
		
	}
	
	public static void print(ByteBuffer buffer) {
		System.out.println("当前位置----------->" + buffer.position());
		System.out.println("limit----------->" + buffer.limit());
		System.out.println("容量－－----------->" + buffer.capacity());
	}
}
